package com.term.util.converter;

import com.term.domain.BaseDomain;
import com.term.util.annotation.Domain2Info;
import com.term.util.locator.BeanLocator;

import java.lang.reflect.Field;

/**
 * Created by chenGang on 2017/1/10.
 */
public class Domain2InfoConverter {

    public static <T extends BaseDomain,U> U convert(T val, Object... var2) {
        U u = null;
        Field[] fields = ClassUtils.getAllFieldsWithRoot(val.getClass());
        String name = null;
        Object value = null;


        for (Field field : fields){
            // 若变量没有Domain2Info注解，则直接跳过
            if (!field.isAnnotationPresent(Domain2Info.class)) continue;

            // 获取传入的domain中field对应的属性的值
            value = ClassUtils.getValue(val, field.getName());

            Domain2Info domain2Info = field.getAnnotation(Domain2Info.class);

            // 获取目标对象属性的name
            name = "".equals(domain2Info.targetName())?field.getName():domain2Info.targetName();

            Field targetField = ClassUtils.getFieldWithRoot(u.getClass(), name);

            // 对获取到的value做特殊转换
            value = transformValue(val, field, value, domain2Info, targetField, var2);

            ClassUtils.setValue(name, value, u);
        }
        return null;
    }

    /**
     * 对获取到的value做特殊转换
     *
     * @param requestObj  请求对象
     * @param field       当前转换的filed
     * @param value       当前转换的filed对应的值
     * @param domain2Info 当前filed的Transition注解信息
     * @param objects     参数列表，当前没有用
     * @return
     */
    private static Object transformValue(Object requestObj, Field field, Object value, Domain2Info domain2Info, Field targetField, Object ... objects) {
        IConverter converter = null;

        // 若目标转换对象为一个实际class类，则进行找具体的转换类做转换
        if (!Object.class.equals(domain2Info.clazz()) && value != null){
            converter = (IConverter) BeanLocator.findBeanByName("DOMAIN2INFO_" + field.getType().getSimpleName() + "_" + domain2Info.clazz().getSimpleName() +
                    "_CONVERTER");

            return converter.convert(value, domain2Info.clazz(), objects);
        }

        // 若没有转换器，则直接返回
        return value;
    }

}
